In [1]:
%pylab inline
#import matplotlib.pyplot as plt
Populating the interactive namespace from numpy and matplotlib
In [2]:
# a szinekhez tartozo toroesmutatok:
nred = 1.33; ngreen = 1.335; nblue = 1.34; 

#  'r' ---> red, 'g' ---> green, 'b' ---> blue
nszinek = {"r":nred, "g":ngreen, "b":nblue}   #   dictionary type variable
In [3]:
nszinek['b']
Out[3]:
1.34

Input: $ \mathbf{i}, \mathbf{N}$ és $n_1, n_2$.

Output (az alábbiak szerint számított): $ \mathbf{r}, \mathbf{t}$

\begin{eqnarray} \mathbf{r} &=& \mathbf{i} \left[\mathbf{1}- 2 \mathbf{N}\circ\mathbf{N} \right] = \mathbf{i} - 2 \left( \mathbf{i} \mathbf{N} \right) \mathbf{N} \nonumber \\ n_2 \mathbf{t} &=& n_1 \mathbf{i} + \mathbf{N}\left(n_1 \cos\vartheta_1 -n_2 \cos\vartheta_2 \right), \,\, \textrm{ahol} \nonumber \\ \cos \vartheta_1 &=& - \mathbf{i N}, \nonumber \\ n_1 \sin \vartheta_1 &=& n_2 \sin \vartheta_2 \nonumber . \end{eqnarray}

In [4]:
def SD(n2,n1,be,normal):
    '''
    Snellius-Descartes-torveny: torestorveny,
    a t vektor szamolasa adott i es N vektorok eseten (mindegyik egysegvektor!!!)
    '''
    cos1=-dot(be,normal)
    sin1= sqrt(1-cos1**2)
    sin2= n1*sin1/n2
    cos2=sqrt(1-sin2**2)
    
    tv=n1/n2*be+(n1/n2*cos1-cos2)*normal

    return(tv)
In [5]:
def line_circle(r0,be,cent,R):
    '''
    
    a kor es az egyenes metszespontjat szamolja
    
    r0 =(x0,y0) az egyenes egy pontja
    be: az egyenes iranyvektora (unit vector!)
    cent: a kor kozeppontja
    R: a kor sugara, R>0, ha (, es R<0, ha ) 
    
    '''
    
    cr=cent-r0
    l= dot(cr,be)
    
    cr3=array([cr[0],cr[1],0])
    be3=array([be[0],be[1],0])
    rhovec=cross(cr3,be3)
    rho= sqrt(dot(rhovec,rhovec))
    s= sqrt(R**2-rho**2)
    
    # sign(R) eldonti, hogy a ket metszespont kozul melyiket valasszuk

    lsp=l-sign(R)*s
    x1=r0[0]+lsp*be[0]
    y1=r0[1]+lsp*be[1]
    rp=array([x1,y1])  #  a kor es az egyenes metszespontja
    
    tmp=-sign(R)*(cent-array([x1,y1]))
    normal=tmp/sqrt(dot(tmp,tmp))
    
    return(rp,normal)
                    
In [6]:
def tores_gomb(n2,n1,r0,be,cent,R):
    '''
    tores gorbult feluleten
    '''
    (rp,normal) = line_circle(r0,be,cent,R)
    ki=SD(n2,n1,be,normal)
    
    return(rp,ki)
    
In [7]:
def rajz_kor(R,cent,fimin,fimax, szin):
    # a lencse alakja
    Np = 100
    #plot([0,0],[R,-R],color=szin, lw=1)
    fi=linspace(fimin,fimax,Np)
    plot(cent[0]+R*cos(fi),cent[1]+R*sin(fi), color=szin, lw=1)
        

1. példa

A fókusz a lencse jobb szélétől (nem a fősíktól) mérve: $f= \frac{n_1}{n_2^2-n_1^2}\, R$

In [8]:
n1,n2 = (1,3/2)

R1=1
cent1=array([0,0])  #  cent: a 1. kor kozeppontja
R2=-1
cent2=array([-1.*abs(R2),0]) #  cent: a 2. kor kozeppontja

r0=array([-2.*R1,0.3*abs(R1)]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai

be_szog= 0*pi/180   # 15*pi/180  
be=array([cos(be_szog),sin(be_szog)]) #  be : bejovo sugar iranyvektora (unit vector)

######  ennyi a szamolas ###################

r1,ki1=tores_gomb(n2,n1,r0,be,cent1,R1)
r2,ki2=tores_gomb(n1,n2,r1,ki1,cent2,R2)

######  ennyi a szamolas -- vege ###################

# abra rajzolas: 

f0=60*pi/180

figsize(16,12)    
#ax=subplot(aspect='equal')

rajz_kor(R1,cent1,pi-f0,pi+f0,'r')
rajz_kor(abs(R2),cent2,-f0,f0,'r')

hlines(y=0., xmin=-2*R1, xmax=1.5*abs(R2), lw=1, color='k',linestyle='--')

plot([r0[0],r1[0]],[r0[1],r1[1]],color='b');
plot([r1[0],r2[0]],[r1[1],r2[1]],color='b');

tmax=1.5
rkint=r2+tmax*ki2
plot([r2[0],rkint[0]],[r2[1],rkint[1]],color='b');
#ax.set_axis_off()

ff= n1*R1/(n2**2-n1**2)
axvline(x=ff, ymin=-10, ymax=10,lw=1,color='k',linestyle='--');


text(cent1[0],cent1[1],  r'$\mathrm{O}=\mathrm{O}_1$', horizontalalignment='center', fontsize=20)
text(cent2[0],cent2[1],  r'$\mathrm{O}_2$', horizontalalignment='center', fontsize=20)

text(cent2[0],0.75,  r'$n_1=$'+ str(n1), horizontalalignment='center', fontsize=20)
text(-0.5,0.5,  r'$n_2=$'+ str(n2), horizontalalignment='center', fontsize=20)
text(cent1[0],0.75,  r'$n_1=1$', horizontalalignment='center', fontsize=20)

V1=-R1 # a lencse bal szelenek koordinataja
V2=0    # a lencse jobb szelenek koordinataja

kitengely= (r2[0]-r2[1]*ki2[0]/ki2[1])-V2

#  numerikus eredmenyek kiiratasa:

print("r0 kezdőpont = ",r0)
print("bejövő sugár irányvektora = ",be)
print("r2 kimenő pont koordinátája = ",r2)
print("kimenő sugár irányvektora = ",ki2)
print("V1 a lencse balszéle = ",V1)
print("V2 a lencse jobbszéle = ",V2)

print("t1v = V2-V1 a lencse vastagsága = ",V2-V1)

print("\n")
print("A kilépő sugár szögének szinusz = ",sin(arctan(ki2[1]/ki2[0])),"\n")
print("A kilépő sugár tengellyel való metszéspontjának \ntávolsága a lencse jobb oldalától mérve = ", 
      kitengely,"\n")

print("A fókusz a lencse jobb szélétől mérve (paraxiális közelítésben) = ",ff)

gca().set_aspect('equal')

grid();
r0 kezdőpont =  [-2.   0.3]
bejövő sugár irányvektora =  [1. 0.]
r2 kimenő pont koordinátája =  [-0.02087041  0.20323693]
kimenő sugár irányvektora =  [ 0.96446054 -0.26422692]
V1 a lencse balszéle =  -1
V2 a lencse jobbszéle =  0
t1v = V2-V1 a lencse vastagsága =  1


A kilépő sugár szögének szinusz =  -0.2642269224917288 

A kilépő sugár tengellyel való metszéspontjának 
távolsága a lencse jobb oldalától mérve =  0.7209691918889258 

A fókusz a lencse jobb szélétől mérve (paraxiális közelítésben) =  0.8
In [9]:
def egy_lencse(be_szog, r0,n1,R1,cent1,n2,R2,cent2,szin):
    
    #r0=array([-2.*R1,0.2*abs(R1)]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai
    #n1,n2 = (1,3/2)
    #R1=1
    #cent1=array([0,0])  #  cent: a 1. kor kozeppontja
    #R2=-1
    #cent2=array([-1.*abs(R2),0]) #  cent: a 2. kor kozeppontja
 
    be=array([cos(be_szog),sin(be_szog)]) #  be : bejovo sugar iranyvektora (unit vector)

    ######  ennyi a szamolas ###################

    r1,ki1=tores_gomb(n2,n1,r0,be,cent1,R1)
    r2,ki2=tores_gomb(n1,n2,r1,ki1,cent2,R2)

    ######  ennyi a szamolas -- vege ###################

# abra rajzolas: 

    f0=60*pi/180

    figsize(14,10)   
    #ax=subplot(aspect='equal')

    rajz_kor(R1,cent1,pi-f0,pi+f0,'r')
    rajz_kor(abs(R2),cent2,-f0,f0,'r')

    hlines(y=0., xmin=-2*R1, xmax=1, lw=1, color='k',linestyle='--')

    plot([r0[0],r1[0]],[r0[1],r1[1]],color=szin);
    plot([r1[0],r2[0]],[r1[1],r2[1]],color=szin);

    tmax=1.2
    rkint=r2+tmax*ki2
    plot([r2[0],rkint[0]],[r2[1],rkint[1]],color=szin);
    #ax.set_axis_off()

    #xlim(0,0.6)
    #ylim(-0.3,0.3)
    #text(cent1[0],cent1[1],  r'$\mathrm{O}=\mathrm{O}_1$', horizontalalignment='center', fontsize=20)
    #text(cent2[0],cent2[1],  r'$\mathrm{O}_2$', horizontalalignment='center', fontsize=20)

    #text(cent2[0],0.75,  r'$n_1=1$', horizontalalignment='center', fontsize=10)
    #text(-0.5,-0.5,  r'$n_2=1.5$', horizontalalignment='center', fontsize=10)
    #text(cent1[0],0.75,  r'$n_1=1$', horizontalalignment='center', fontsize=10)

    V1=-R1 # a lencse bal szelenek koordinataja
    V2=0    # a lencse jobb szelenek koordinataja

    kitengely= (r2[0]-r2[1]*ki2[0]/ki2[1])-V2
    gca().set_aspect('equal')
    grid();
In [10]:
n1,n2 = (1,3/2)

R1=1
cent1=array([0,0])  #  cent: a 1. kor kozeppontja
R2=-1
cent2=array([-1.*abs(R2),0]) #  cent: a 2. kor kozeppontja

r0=array([-2.0,-0.2]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai
Np=10
beszogvec= linspace(-5,20,Np)

#for szog in beszogvec:
#    szog = szog*pi/180
#    egy_lencse(szog, r0,n1,R1,cent1,n2,R2,cent2,'darkorange')

yvec=linspace(-0.14,0.14,Np)    
for y in yvec:
    r0=array([-2,y])
    szog = 0*pi/180
    egy_lencse(szog, r0,n1,R1,cent1,n2,R2,cent2,'b')
    
yvec=linspace(-0.25,0.,Np)    
for y in yvec:
    r0=array([-2,y])
    szog = 10*pi/180
    egy_lencse(szog, r0,n1,R1,cent1,n2,R2,cent2,'g')
    

plot([-2,1.5], [0, 0],lw=2,color='k',linestyle='--');

ff= n1*R1/(n2**2-n1**2)
plot([ff,ff], [-0.5, 0.5],lw=1,color='k',linestyle='--');
print("A fókusz a lencse jobb szélétől mérve (paraxiális közelítésben) = ",ff)

grid();
#show()
    
A fókusz a lencse jobb szélétől mérve (paraxiális közelítésben) =  0.8
In [11]:
n1,n2 = (1,3/2)

R1=1
cent1=array([0,0])  #  cent: a 1. kor kozeppontja
R2=-1
cent2=array([-1.9*abs(R2),0]) #  cent: a 2. kor kozeppontja
V2=cent2[0]+abs(R2)

r0=array([-2.0,-0.2]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai

Np=10
yvec=linspace(-0.1,0.1,Np)    
for y in yvec:
    r0=array([-2,y])
    szog = 0*pi/180
    egy_lencse(szog, r0,n1,R1,cent1,n2,R2,cent2,'b')
    

f=0.983050847457627
print("A fókusz a lencse jobb szélétől mérve (paraxiális közelítésben) = ",f)
    
plot([f+V2,f+V2],[-0.2,0.2], lw=1, color='k',linestyle='--')  # fokusztavolsag
#xlim(0.,0.5)
#ylim(-0.15,0.15)

grid()
show();
A fókusz a lencse jobb szélétől mérve (paraxiális közelítésben) =  0.983050847457627

2. példa: gömblencse

In [12]:
n1,n2 = (1,3/2)

R1=1
cent1=array([0,0])  #  cent: a 1. kor kozeppontja
R2=-1
cent2=cent1 #  cent: a 2. kor kozeppontja

r0=array([-2.*R1,0.25*abs(R1)]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai

be_szog= 0*15*pi/180  
be=array([cos(be_szog),sin(be_szog)]) #  be : bejovo sugar iranyvektora (unit vector)

######  ennyi a szamolas ###################

r1,ki1=tores_gomb(n2,n1,r0,be,cent1,R1)
r2,ki2=tores_gomb(n1,n2,r1,ki1,cent2,R2)

######  ennyi a szamolas -- vege ###################

# abra rajzolas: 

f0=90*pi/180

figsize(16,12)   
ax=subplot(aspect='equal')

rajz_kor(R1,cent1,pi-f0,pi+f0,'r')
rajz_kor(abs(R2),cent2,-f0,f0,'r')

ax.hlines(y=0., xmin=-2*R1, xmax=2.5, lw=1, color='k',linestyle='--')

plot([r0[0],r1[0]],[r0[1],r1[1]],color='b');
plot([r1[0],r2[0]],[r1[1],r2[1]],color='b');

tmax=2.
rkint=r2+tmax*ki2
plot([r2[0],rkint[0]],[r2[1],rkint[1]],color='b');


f=R1*n2/(2*n1)/(n2-n1) # paraxialis kozelitesben, matrixokkal szamolva jobb fosiktol merve: f= R*n2/(2*n1)/(n2-n1)
h1=R1/n1  # bal fosik
h2=h1     # jobb fosik
plot([f,f],[-0.2,0.2], lw=2, color='k',linestyle='--')  # fokusztavolsag
text(f,-0.4,  r'$f=\frac{R}{2}\,\frac{n_2}{n_1 \left(n_2-n_1\right)}-\frac{R}{n_1}$', 
     horizontalalignment='center', fontsize=16)
text(f,-0.6,  r' lencse szélétől mérve', 
     horizontalalignment='center', fontsize=16)


plot([h1-R1,h1-R1],[-0.2,0.2], lw=2, color='k',linestyle='--')  # bal fosik
text(h1-R1,-0.4,  r'$h_1=h_2=-\frac{R}{n_1}$', horizontalalignment='center', fontsize=16)
#plot([h2-R1,h2-R1],[-0.2,0.2], lw=2, color='k',linestyle='--')  # bal fosik
#text(h2-R1,-0.8,  r'$h_1=h_2=-\frac{R}{n_1}$', horizontalalignment='center', fontsize=16)


#text(cent1[0],cent1[1],  r'$\mathrm{O}=\mathrm{O}_1$', horizontalalignment='center', fontsize=20)
#text(cent2[0],cent2[1],  r'$\mathrm{O}_2$', horizontalalignment='center', fontsize=20)

text(-1.5,0.75,  r'$n_1=1$', horizontalalignment='center', fontsize=16)
text(0.,0.5,  r'$n_2=1.5$', horizontalalignment='center', fontsize=16)
#text(cent1[0],0.75,  r'$n_1=1$', horizontalalignment='center', fontsize=10)

V1=-R1 # a lencse bal szelenek koordinataja
V2=R1    # a lencse jobb szelenek koordinataja

kitengely= (r2[0]-r2[1]*ki2[0]/ki2[1])-V2

#  numerikus eredmenyek kiiratasa:

print("r0 kezdőpont = ",r0)
print("bejövő sugár irányvektora = ",be)
print("r2 kimenő pont koordinátája = ",r2)
print("kimenő sugár irányvektora = ",ki2)
print("V1 a lencse balszéle = ",V1)
print("V2 a lencse jobbszéle = ",V2)

print("t1v = V2-V1 a lencse vastagsága = ",V2-V1)

print("\n")
print("A kilépő sugár szögének szinusz = ",sin(arctan(ki2[1]/ki2[0])),"\n")
print("A kilépő sugár tengellyel való metszéspontjának \ntávolsága a lencse jobb szélétől mérve = ", 
      kitengely,"\n")

print("Fokusztávolsága a lencse jobb/bal fősíktól mérve (paraxiális közelítésben) = ", f,"\n")
print("A fókusz a lencse jobb szélétől mérve (paraxiális közelítésben) = ",f-h1)

print("Baloldali fősík  a lencse bal oldalától mérve = ", h1,"\n")
print("Jobboldali fősík a lencse bal oldalától mérve = ", h2,"\n")

#ax.set_axis_off()
grid()
r0 kezdőpont =  [-2.    0.25]
bejövő sugár irányvektora =  [1. 0.]
r2 kimenő pont koordinátája =  [0.99662218 0.08212331]
kimenő sugár irányvektora =  [ 0.9855061  -0.16963999]
V1 a lencse balszéle =  -1
V2 a lencse jobbszéle =  1
t1v = V2-V1 a lencse vastagsága =  2


A kilépő sugár szögének szinusz =  -0.16963998891547752 

A kilépő sugár tengellyel való metszéspontjának 
távolsága a lencse jobb szélétől mérve =  0.47370912718322256 

Fokusztávolsága a lencse jobb/bal fősíktól mérve (paraxiális közelítésben) =  1.5 

A fókusz a lencse jobb szélétől mérve (paraxiális közelítésben) =  0.5
Baloldali fősík  a lencse bal oldalától mérve =  1.0 

Jobboldali fősík a lencse bal oldalától mérve =  1.0 

In [13]:
n1,n2 = (1,4/3)

R1=1
cent1=array([0,0])  #  cent: a 1. kor kozeppontja
R2=-R1
cent2=cent1 #  cent: a 2. kor kozeppontja

r0=array([-2.0,-0.2]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai
Np=10
beszogvec= linspace(-5,20,Np)

for szog in beszogvec:
    szog = szog*pi/180
    egy_lencse(szog, r0,n1,R1,cent1,n2,R2,cent2,'b')

yvec=linspace(-0.2,0.2,Np)    
for y in yvec:
    r0=array([-2,y])
    egy_lencse(.0, r0,n1,R1,cent1,n2,R2,cent2,'darkcyan')
   

grid();

3. példa: Nussbaum \& Phillips könyvből

A. Nussbaum & R. A. Phillips: Modern optika mérnököknek és kutatóknak (Műszaki Könykiadó, 1982.), 45. oldal, 2-4. ábra.

A 46. oldal alján a FORTRAN program futásának eredménye (a kilépő sugár szögének szinusza és a kilépő sugár tengellyel való metszéspontjának távolsága a lencse jobb oldalától mérve) pontosan egyezik az alábbi számolással.

In [14]:
n1,n2 = (1,3/2)

R1=50
cent1=array([0,0])  #  cent: a 1. kor kozeppontja
R2=-R1

t1v=15  #  a lencse vastagsaga.
cent2=array([t1v-R1-abs(R2),0]) #  cent: a 2. kor kozeppontja

r0=array([-200-R1,0]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai

be_szog= arcsin(0.1)  
be=array([cos(be_szog),sin(be_szog)]) #  be : bejovo sugar iranyvektora (unit vector)

######  ennyi a szamolas ###################

r1,ki1=tores_gomb(n2,n1,r0,be,cent1,R1)
r2,ki2=tores_gomb(n1,n2,r1,ki1,cent2,R2)

######  ennyi a szamolas -- vege ###################

# abra rajzolas: 

f0=50*pi/180

figsize(16,16)   
ax=subplot(aspect='equal')

rajz_kor(R1,cent1,pi-f0,pi+f0,'r')
rajz_kor(abs(R2),cent2,-f0,f0,'r')


ax.hlines(y=0., xmin=-250, xmax=25, lw=1, color='k',linestyle='--')

plot([r0[0],r1[0]],[r0[1],r1[1]],color='b');
plot([r1[0],r2[0]],[r1[1],r2[1]],color='b');

tmax=100
rkint=r2+tmax*ki2
plot([r2[0],rkint[0]],[r2[1],rkint[1]],color='b');


text(cent1[0],cent1[1],  r'$\mathrm{O}=\mathrm{O}_1$', horizontalalignment='center', fontsize=20)
text(cent2[0],cent2[1],  r'$\mathrm{O}_2$', horizontalalignment='center', fontsize=20)

text(-60,-15.,  r'$n_1=1$', horizontalalignment='center', fontsize=10)
text(-42.,-8.,  r'$n_2=1.5$', horizontalalignment='center', fontsize=10)
text(-28,-15,  r'$n_1=1$', horizontalalignment='center', fontsize=10)

xlim(-260,25)
ylim(-30,30)
#ax.set_axis_off()

V1=-R1 # a lencse bal szelenek koordinataja
V2=-(R1-t1v)    # a lencse jobb szelenek koordinataja

kitengely= (r2[0]-r2[1]*ki2[0]/ki2[1])-V2

text(V1,0,  r'$\mathrm{V}_1$', horizontalalignment='center', fontsize=20)
text(V2,0,  r'$\mathrm{V}_2$', horizontalalignment='center', fontsize=20)

axvline(x=0, lw=1,color='k',linestyle='--')
axvline(x=cent2[0], ymin=-20, ymax=20,lw=1,color='k',linestyle='--')

#  numerikus eredmenyek kiiratasa:

print("r0 kezdőpont = ",r0)
print("bejövő sugár irányvektora = ",be)
print("r2 kimenő pont koordinátája = ",r2)
print("kimenő sugár irányvektora = ",ki2)
print("V1 a lencse balszéle = ",V1)
print("V2 a lencse jobbszéle = ",V2)

print("t1v = V2-V1 a lencse vastagsága = ",V2-V1)

print("\nAz alábbi eredmény egyezik a Nussbaum & Phillips könyvbelivel!\n")
print("A kilépő sugár szögének szinusz = ",sin(arctan(ki2[1]/ki2[0])),"\n")
print("A kilépő sugár tengellyel való metszéspontjának \ntávolsága a lencse jobb oldalától mérve = ", 
      kitengely,"\n")
r0 kezdőpont =  [-250    0]
bejövő sugár irányvektora =  [0.99498744 0.1       ]
r2 kimenő pont koordinátája =  [-39.17762724  20.00775237]
kimenő sugár irányvektora =  [ 0.92793432 -0.37274374]
V1 a lencse balszéle =  -50
V2 a lencse jobbszéle =  -35
t1v = V2-V1 a lencse vastagsága =  15

Az alábbi eredmény egyezik a Nussbaum & Phillips könyvbelivel!

A kilépő sugár szögének szinusz =  -0.3727437387583656 

A kilépő sugár tengellyel való metszéspontjának 
távolsága a lencse jobb oldalától mérve =  45.63107023066068 

4. példa: Zeiss Tessar lens, négy különböző lencse

The Zeiss Tessar is a famous photographic lens, invented in 1902 by Paul Rudolph of the Carl Zeiss optical company.

Ábra: itt és itt.

Számolás részletei*: Eugene Hecht: Optics (4th Edition, 2002), lásd még: pp. 250-251, figure 6.10

*This particular example was chosen primarily because Nussbaum's book Geometric Optics contains a simple Fortran computer program written specifically for this lens. It would be almost silly to evaluate the system matrix by hand.

Az ábra, a lencsék paraméterei és a köztük lévő távolságok itt: A. Nussbaum & R. A. Phillips: Modern optika mérnököknek és kutatóknak (Műszaki Könykiadó, 1982.), 39. oldal, 1-19. ábra és alatta a táblázat.

In [15]:
#  toresmutatok, gorbuleti sugarak, lencsek kozti tavolsag (az optikai tengelyen):

ni = (1.6116, 1.6053, 1.5123, 1.6116)  # a lencsek toresmutatoi
Ri = (1.628, -27.57, -3.457, 1.582, 10000000, 1.920, -2.4) # a lencsek gorbuleti sugarai
di = (0.357, 0.189, 0.081, 0.325, 0.217, 0.396) #  lencsek kozti tavolsagok
In [16]:
# a lencsek kozeppontjai: 

cent1=array([0,0])
cent2=array([di[0]-Ri[0]-abs(Ri[1]),0])
cent3=array([di[1]+abs(Ri[1])-abs(Ri[2])+cent2[0],0])
cent4=array([di[2]+abs(Ri[2])+abs(Ri[3])+cent3[0],0])
vert5=di[3]+cent4[0]-abs(Ri[3])
cent6=array([di[4]+abs(Ri[5])+vert5,0])
cent7=array([di[5]+cent6[0]-abs(Ri[5])-abs(Ri[6]),0])
cent2,cent3,cent4, vert5, cent6, cent7
Out[16]:
(array([-28.841,   0.   ]),
 array([-4.539,  0.   ]),
 array([0.581, 0.   ]),
 -0.6760000000000015,
 array([1.461, 0.   ]),
 array([-2.463,  0.   ]))
In [17]:
V1, V2, V3, V4, V5, V6, V7 =cent1[0]-abs(Ri[0]),cent2[0]+abs(Ri[1]), cent3[0]+abs(Ri[2]), cent4[0]-abs(Ri[3]), vert5, cent6[0]-abs(Ri[5]), cent7[0]+abs(Ri[6])
V1,V2, V3, V4, V5, V6, V7
Out[17]:
(-1.628,
 -1.2710000000000008,
 -1.0820000000000016,
 -1.0010000000000014,
 -0.6760000000000015,
 -0.4590000000000014,
 -0.0630000000000015)
In [18]:
V2-V1, V3-V2, V4-V3,V5-V4, V6-V5, V7-V6
Out[18]:
(0.3569999999999991,
 0.18899999999999917,
 0.08100000000000018,
 0.32499999999999996,
 0.21700000000000008,
 0.3959999999999999)
In [19]:
def Tessar_raytracing(be_szog, r0,szin):
    '''
    Tessar lencse sugarmenete
    '''
    
    # numerika

    #r0=array([-2,0.1]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai
    #r0=array([-2,-1.1]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai

    #be_szog= 10*pi/180 
    be=array([cos(be_szog),sin(be_szog)]) #  be : bejovo sugar iranyvektora (unit vector)

    r1,ki1=tores_gomb(ni[0],1,r0,be,cent1,Ri[0])
    r2,ki2=tores_gomb(1,ni[0],r1,ki1,cent2,Ri[1])
    r3,ki3=tores_gomb(ni[1],1,r2,ki2,cent3,Ri[2])
    r4,ki4=tores_gomb(1,ni[1],r3,ki3,cent4,Ri[3])

    r5= array([vert5,r4[1]+ki4[1]/ki4[0]*(vert5-r4[0])])
    ki5 = SD(ni[2],1,ki4,array([-1,0]))
    #(r6,normal) = line_circle(r5,ki5,cent6,Ri[5])

    r6,ki6=tores_gomb(ni[3],ni[2],r5,ki5,cent6,Ri[5])
    r7,ki7=tores_gomb(1,ni[3],r6,ki6,cent7,Ri[6])

    figsize(16,14)   
    #ax=subplot(aspect='equal')
    

    # fenysugarak rajzolasa 

    plot([r0[0],r1[0]],[r0[1],r1[1]],color=szin);
    plot([r1[0],r2[0]],[r1[1],r2[1]],color=szin);
    plot([r2[0],r3[0]],[r2[1],r3[1]],color=szin);
    plot([r3[0],r4[0]],[r3[1],r4[1]],color=szin);
    plot([r4[0],r5[0]],[r4[1],r5[1]],color=szin);
    plot([r5[0],r6[0]],[r5[1],r6[1]],color=szin);
    plot([r6[0],r7[0]],[r6[1],r7[1]],color=szin);

    tmax=5
    rkint=r7+tmax*ki7
    plot([r7[0],rkint[0]],[r7[1],rkint[1]],color=szin);
    
    #plot([cent3[0],r3[0]],[cent3[1],r3[1]],'--')
    #plot([cent7[0],r7[0]],[cent7[1],r7[1]],'--')
    
    
    ## lencsek rajzolasa
    f0=pi/180   

    rajz_kor(Ri[0],cent1,pi-21.63*f0,pi+21.63*f0,'r')
    rajz_kor(abs(Ri[1]),cent2,-1.247*f0,1.247*f0,'r')

    rajz_kor(abs(Ri[2]),cent3,-6.65*f0,6.65*f0,'r')
    rajz_kor(abs(Ri[3]),cent4,pi-14.64*f0,pi+14.64*f0,'r')

    plot([vert5,vert5],[-0.4,0.4], color='r')
    rajz_kor(abs(Ri[5]),cent6,pi-12*f0,pi+12*f0,'r')
    rajz_kor(abs(Ri[6]),cent7,-9.5*f0,9.5*f0,'r')

    plot([cent1[0]+abs(Ri[0])*cos(pi-21.63*f0),cent2[0]+abs(Ri[1])*cos(1.247*f0)],[0.6,0.6], color='r')
    plot([cent1[0]+abs(Ri[0])*cos(pi-21.63*f0),cent2[0]+abs(Ri[1])*cos(1.247*f0)],[-0.6,-0.6], color='r')
    plot([cent3[0]+abs(Ri[2])*cos(6.65*f0),cent4[0]+abs(Ri[3])*cos(pi-14.64*f0)],[0.4,0.4], color='r')
    plot([cent3[0]+abs(Ri[2])*cos(6.65*f0),cent4[0]+abs(Ri[3])*cos(pi-14.64*f0)],[-0.4,-0.4], color='r')
    plot([vert5,cent7[0]+abs(Ri[6])*cos(9.5*f0)],[0.4,0.4], color='r')
    plot([vert5,cent7[0]+abs(Ri[6])*cos(9.5*f0)],[-0.4,-0.4], color='r')

    #plot([-2,1],[0,0],'k--')
    hlines(y=0., xmin=r0[0], xmax=5, lw=1, color='k',linestyle='--')
    axvline(x=0, ymin=-10, ymax=10,lw=1,color='k',linestyle='--');
    axvline(x=4.406096902985778, ymin=-10, ymax=10,lw=1,color='k',linestyle='--');

    xlim(-2.,6.0);
    gca().set_aspect('equal')
    #grid();
    #print(r7,ki7)
In [20]:
Np=7
be_szog=0*pi/180
r0y=linspace(-0.4,0.4,Np)

for y0 in r0y: 
    Tessar_raytracing(be_szog, array([-2,y0]),'b')
    
    Np=5
be_szog=10*pi/180
r0y=linspace(-0.6,0.6,Np)

for y0 in r0y: 
    Tessar_raytracing(be_szog, array([-2,y0]),'lime')
    
#show();
In [21]:
Np=5

be_szog_vec=linspace(-5,5,Np)

for szog in be_szog_vec: 
    be_szog= szog*pi/180
    Tessar_raytracing(be_szog, array([-10,0.15]),'b')
    
In [22]:
Np=5

be_szog_vec=linspace(-5,5,Np)

for szog in be_szog_vec: 
    be_szog= szog*pi/180
    Tessar_raytracing(be_szog, array([-2,0.15]),'b')
    
In [23]:
def Tessar_fokusz(be_szog, r0):
    '''
    Tessar lencse fokustavolsaga,
    vizszintesen bejovo (parhuzamos) suagarak a fokuszpontba talalkoznak.
    '''
    #r0=array([-2,0.2]) #  r0=(x0,y0) a bejovo sugar kezdo pontjanak koordinatai

    #be_szog= 0*pi/180 
    be=array([cos(be_szog),sin(be_szog)]) #  be : bejovo sugar iranyvektora (unit vector)

    r1,ki1=tores_gomb(ni[0],1,r0,be,cent1,Ri[0])
    r2,ki2=tores_gomb(1,ni[0],r1,ki1,cent2,Ri[1])
    r3,ki3=tores_gomb(ni[1],1,r2,ki2,cent3,Ri[2])
    r4,ki4=tores_gomb(1,ni[1],r3,ki3,cent4,Ri[3])

    r5= array([vert5,r4[1]+ki4[1]/ki4[0]*(vert5-r4[0])])
    ki5 = SD(ni[2],1,ki4,array([-1,0]))
    #(r6,normal) = line_circle(r5,ki5,cent6,Ri[5])

    r6,ki6=tores_gomb(ni[3],ni[2],r5,ki5,cent6,Ri[5])
    r7,ki7=tores_gomb(1,ni[3],r6,ki6,cent7,Ri[6])

    f= (r7[0]*ki7[1]-r7[1]*ki7[0])/ki7[1]-V7  # az utolso lencsetol merve
    #print("v7-r7[0]= ",V7,r7[0], V7-r7[0])
    
    return( f)
In [24]:
Np=20
be_szog= 0*pi/180
r0y=linspace(-0.1,0.1,Np)
[(y0,Tessar_fokusz(be_szog, array([-2,y0]))) for y0 in r0y]
Out[24]:
[(-0.1, 4.404626995117664),
 (-0.08947368421052632, 4.404916082785706),
 (-0.07894736842105264, 4.4051748446312216),
 (-0.06842105263157895, 4.405402641448719),
 (-0.05789473684210527, 4.405598917491753),
 (-0.04736842105263159, 4.405763199033398),
 (-0.0368421052631579, 4.405895093143905),
 (-0.026315789473684223, 4.4059942866803805),
 (-0.015789473684210534, 4.406060545483722),
 (-0.005263157894736845, 4.4060937137793825),
 (0.005263157894736831, 4.40609371377938),
 (0.01578947368421052, 4.406060545483724),
 (0.02631578947368421, 4.405994286680382),
 (0.0368421052631579, 4.405895093143905),
 (0.04736842105263156, 4.405763199033397),
 (0.05789473684210525, 4.405598917491752),
 (0.06842105263157894, 4.405402641448715),
 (0.07894736842105263, 4.405174844631219),
 (0.08947368421052632, 4.404916082785706),
 (0.1, 4.404626995117664)]
In [25]:
y0=0.001
Tessar_fokusz(be_szog, array([-2,y0]))
Out[25]:
4.406097711893769
In [26]:
be_szog= 0*pi/180
Np=100
r0y=linspace(-0.8,0.6,Np)

f=[]
for y0 in r0y:
    f.append(Tessar_fokusz(be_szog, array([-2,y0])))


fig, ax = plt.subplots(figsize=(12,6))

ax.plot(r0y, f, 'r');

hlines(y=4.406096902985778, xmin=r0y[0], xmax=r0y[-1], lw=1, color='k',linestyle='--')
xlabel(r'$y_0$', fontsize=20,rotation=0,labelpad=10)
ylabel('f', fontsize=20,rotation=0,labelpad=20)

#ylim(4.4,4.41)
grid();
In [27]:
figsize(10,6)

plot(r0y, f, 'r');

hlines(y=4.406096902985778, xmin=r0y[0], xmax=r0y[-1], lw=1, color='k',linestyle='--')
xlabel(r'$y_0$', fontsize=20,rotation=0,labelpad=10)
ylabel('f', fontsize=20,rotation=0,labelpad=20)

ylim(4.4,4.407)
grid();
In [ ]: